// 封装axios实例，用于统一管理HTTP请求
import axios, { AxiosResponse } from 'axios'; // 引入axios库及其响应类型
import { error, log } from 'console';
import { ElMessage } from 'element-plus'; // 引入Element Plus的消息提示组件 
//导入common下面的indexts
import { logout } from '@/common';

// 创建axios实例，配置默认参数
const instance = axios.create({
  baseURL: '/api', // 后端服务器地址
  timeout: 5000, // 请求超时时间（毫秒）
  headers: { 'Content-Type': 'application/json' } // 默认请求头
});

// 请求拦截器：在发送请求前统一处理配置
instance.interceptors.request.use(
  (config) => {
    //判断是否存在 token
    let token = localStorage.getItem('token'); // 从本地存储获取token
    if (token) {
      if (config.headers){
        config.headers["Authorization"] = `Bearer ${token}`; // 添加token到请求头
      }
      
    }
    return config; // 直接返回配置，不做额外处理
  },
  (error) => {
    console.log("请求拦截器错误",error);
    return Promise.reject(error); // 请求错误时直接拒绝
  }
);

// 响应拦截器：统一处理响应数据或错误
instance.interceptors.response.use(
  response => {
    console.log(response.status); // 打印响应状态码

    // 请求成功但业务逻辑失败时提示用户
    const data = response.data as IResponse<any>; // 类型断言为通用响应格式
    // console.log('响应拦截器收到数据:', data); // 添加日志输出
    if (data.code && data.code !== 200) {
      // console.warn('业务错误:', data.info); // 修改为info字段
      ElMessage.error(data.info); // 显示错误消息
      return Promise.reject(data); // 返回错误信息
    }
    
    // 返回完整的响应数据，保持axios响应格式
    response.data = data; // 将处理后的数据赋值回response
    return response; // 返回完整响应对象
  },
  (AxiosError) => {
    // 请求失败时根据状态码处理错误
    if (AxiosError.status === 401) {
      //调用封装的登出方法
      logout(undefined,()=>{
        ElMessage.error(AxiosError.message + ' 登录已过期，请重新登录'); // 未授权错误提示
      })

      return Promise.reject(AxiosError); // 拒绝Promise
    } else if (AxiosError.status === 500) {
      ElMessage.error(AxiosError.message + ' 后端服务器错误'); // 服务器错误提示 
    }
  }
);

// 导出封装好的axios实例，供其他模块使用
export default instance;